<?php
namespace app\index\controller;
use think\Exception;
use QL\QueryList;
use QL\Ext\AbsoluteUrl;			// 将相对路径自动处理成绝对路径
use QL\Ext\CurlMulti;			// 多线程爬虫

class Index
{
    public function index()
    {
		$baseUrl = 'https://www.yp.mo';
		$start = [
		    // 最大并发数，这个值可以运行中动态改变。
		    'maxThread' => 10,
		    // 触发curl错误或用户错误之前最大重试次数，超过次数$error指定的回调会被调用。
		    'maxTry' => 3,
		    // 全局CURLOPT_*
		    'opt' => [
		        CURLOPT_TIMEOUT => 10,
		        CURLOPT_CONNECTTIMEOUT => 1,       // connecttimeout
		        CURLOPT_RETURNTRANSFER => true,    // retruntransfer
		        CURLOPT_SSL_VERIFYPEER => false    // verifypeer
		    ],
		    'cache' => [
		        'enable' => true, 
		        'compress' => false, 
		        'dir' => ROOT_PATH.'/runtime/splider_cache/', 
		        'expire' => 86400, 
		        'verifyPost' => false
		    ]
		];

		try {

			// 注册插件
		    $ql = QueryList::use([
		        AbsoluteUrl::class, // 转换URL相对路径到绝对路径
		        CurlMulti::class    // Curl多线程采集
		    ]);

		    // 获取分类列表对应的链接
		    $urls = $ql->get($baseUrl)->absoluteUrl($baseUrl)->find('.group li a')->attrs('href')->all();
		    $ql->rules([
		        'link' => ['.detail dl dt a','href']
		    ])
		    ->curlMulti($urls)
		    ->success(function (QueryList $ql,CurlMulti $curl,$r) use ($baseUrl, $start) {
		        $curUrl = $r['info']['url'];
		        //echo "Current category url: ". urldecode($curUrl) ." \r\n";

		        // 如果当前没有分页标志，则去页面寻找总页数并且循环请求页面
		        if(strpos($curUrl, 'page') === false) {
		            $html = $ql->getHtml();
		            preg_match('/totalPage: parseInt\("(\d+)"\)/',$html,$arr);
		            $totalPage = $arr[1];
		            if($totalPage) {
		                // 分页链接
		                for ($i=2; $i <= $totalPage; $i++) { 
		                    $curl->add($curUrl . '?page=' . $i);
		                }
		            }
		        }

		        // 获取某个分类下所有的公司的链接
		        $data = $ql->absoluteUrl($baseUrl)->query()->getData();	

		        // 某个分类下如果存在公司则开始对其详情做采集
		        if(count($data->all())){
		            //这里采集详情入库, 重新实例一个新ql对象
		            $q = (new QueryList)->use(CurlMulti::class);
		            $q->rules([
		                'name' => ['a.no-under','text'],
		                'category' => ['#categorieName', 'text'],
		                'sub_category' => ['#subCategorieName', 'text'],
		                'address' => ['.detail dd:eq(0)','text'],
		                'address2' => ['.detail dd:eq(1)','text'],
		                'tel' => ['[title^=電話]','text', '', function($tel){
		                    return trim(explode('：',$tel)[1]);
		                }],
		                'fax' => ['[title^=傳真]','text', '', function($fax){
		                    return trim(explode('：',$fax)[1]);
		                }],
		                'email' => ['[title^=電子郵件]','text', '', function($email){
		                    return trim(explode('：',$email)[1]);
		                }],
		                'url' => ['[title^=網址] a','text'],
		                'facebook' => ['[title^=Facebook] a', 'text'],
		                'content' => ['#bSurvey','html', '', function($content){
		                    return $content ? htmlspecialchars($content) : '';
		                }],
		                'logo' => ['.bussness-LOGO .t-c img','src'],
		                'images' => ['.meta-carousel-thumb', 'html', '', function($item){
		                    if($item){
		                        $images = QueryList::html($item)->find('img')->attrs('src')->all();
		                        if($images){
		                            return implode(',',$images);
		                        }
		                    }
		                    return '';
		                }],
		                'long' => ['body', 'html', '', function($content){
		                    if($content){
		                        preg_match('/businessLongitude = "(\S+)"/',$content, $arr);
		                        return isset($arr[1]) ? trim($arr[1]) : '';
		                    }
		                }],
		                'lat' => ['body', 'html', '', function($content){
		                    if($content){
		                        preg_match('/businessLatitude = "(\S+)"/',$content, $arr);
		                        return isset($arr[1]) ? trim($arr[1]) : '';
		                    }
		                }]
		            ])
		            ->curlMulti(array_column($data->all(),'link'))    // 进入详情页面链接进行采集
		            ->success(function(QueryList $q,CurlMulti $c, $rs) {
		                $curUrl= $rs['info']['url'];
		                //echo "Current details url:{$curUrl} \r\n";
		                $data = $q->query()->getData();
		                $q->destruct();
		                $data = current($data->all());
		                var_dump($data);
		                die;
		                // $result = $database->query('SELECT id FROM huangye WHERE `name` = ?', $data['name'])->fetch();
		                // if(!isset($result->id)) {
		                //     $database->query('INSERT INTO huangye', $data);
		                // }else{
		                //     if(IS_UPDATE) {
		                //         $database->query('UPDATE huangye SET ? WHERE `name`= ?', $data, $data['name']);
		                //     }
		                // }
		            })
		            ->start($start);
		        }
		        
		        $ql->destruct();
		    })
		    ->start($start); 

		    echo "完成";
		}catch(\Exception $e) {
			var_dump($e->getMessage());
			die;
		}

    }


    public function testSplider() {
    	// 实例querylist框架类
    	$ql = QueryList::getInstance();	
    	// 注册多线程插件
    	$ql->use(CurlMulti::class);

    	$url_arr = ["http://www.zerofc.cn"];
    	$rules = [
    		"zongjie" => [".fix .t a","text"],
    		// "zuopin" => ["","text"],
    	];
    	$ql->rules($rules)->curlMulti($url_arr)->success(function(QueryList $ql, CurlMulti $curl, $r) {
    		$curr_url = $r['info']['url'];
    		$views = $ql->query()->getData()->all();
    		var_dump($views);
    		echo "<br/><br/>".$curr_url;
    		die;
    	})->start();
    }

    public function test() {
    	//   	// 采集某页面所有的图片
		// $data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('img')->attrs('src');
		// //打印结果
		// var_dump($data->all());
		// die;

		// //采集某页面所有的超链接和超链接文本内容
		// //可以先手动获取要采集的页面源码
		// $html = file_get_contents('http://cms.querylist.cc/google/list_1.html');
		// //然后可以把页面源码或者HTML片段传给QueryList
		// $data = QueryList::html($html)->rules([  //设置采集规则
		//     // 采集所有a标签的href属性
		//     'link' => ['a','href'],
		//     // 采集所有a标签的文本内容
		//     'text' => ['a','text']
		// ])->query()->getData();
		// //打印结果
		// print_r($data->all());
		

		// 需要采集的目标页面
		// $page = 'http://cms.querylist.cc/news/566.html';
		// //采集规则
		// $reg = [
		//     //采集文章标题
		//     'title' => ['h1','text'],
		//     //采集文章发布日期,这里用到了QueryList的过滤功能，过滤掉span标签和a标签
		//     'date' => ['.pt_info','text','-span -a',function($content){
		//         //用回调函数进一步过滤出日期
		//         $arr = explode(' ',$content);
		//         return $arr[0];
		//     }],
		//     //采集文章正文内容,利用过滤功能去掉文章中的超链接，但保留超链接的文字，并去掉版权、JS代码等无用信息
		//     'content' => ['.post_content','html','a -.content_copyright -script']
		// ];
		// $rang = '.content';
		// $ql = QueryList::get($page)->rules($reg)->range($rang)->query();

		// $data = $ql->getData(function($item) {
		//   //利用回调函数下载文章中的图片并替换图片路径为本地路径
		//   //使用本例请确保当前目录下有image文件夹，并有写入权限
		//   $content = QueryList::html($item['content']);
		//   $content->find('img')->map(function($img){
		//       $src = 'http://cms.querylist.cc'.$img->src;
		//       $localSrc = './static/splider/'.md5($src).'.jpg';
		//       $stream = file_get_contents($src);
		//       file_put_contents($localSrc,$stream);
		//       $img->attr('src', $localSrc);
		//   });
		//   $item['content'] = $content->find('')->html();
		//   return $item;
		// });

		// //打印结果
		// print_r($data->all());
    }

}
